/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package escom.ipn.modelo.dao;

import escom.ipn.modelo.dto.IncidenteClass;
import escom.ipn.modelo.dto.Incidente_Class;
import escom.ipn.modelo.dto.XMLExterna;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Daniel
 */
public class incidenteDAO {
    public static final String SQL_INSERT =
            "INSERT INTO incidente( "
            + "CAT_TIPO_INCIDENTE_id_tipo_incidente, "
            + "CAT_ESTADOS_INCIDENTE_id_estado_incidente, "
            + "SECTOR_id_sector,"
            + "lugar, "
            + "fecha )"            
            + "VALUES (?, ?, ?, ?, ?)";
    public static final String SQL_UPDATE_ESTADO =
            "UPDATE incidente SET "
//            + "CAT_FIN_INCIDENTE_id_fin_incidente = ? "
            + "CAT_ESTADOS_INCIDENTE_id_estado_incidente = ? "
            + "WHERE id_incidente = ? ";
    public static final String SQL_UPDATE_LUGAR_REPORTANTE =
            "UPDATE incidente SET "
//            + "CAT_FIN_INCIDENTE_id_fin_incidente = ? "
            + "lugar_reportante = ? "
            + "WHERE id_incidente = ? ";
    public static final String SQL_UPDATE_REPORTANTE =
            "UPDATE incidente SET "
//            + "CAT_FIN_INCIDENTE_id_fin_incidente = ? "
            + "reportante = ? "
            + "WHERE id_incidente = ? ";
    public static final String SQL_UPDATE_FIN =
            "UPDATE incidente SET "
            + "CAT_FIN_INCIDENTE_id_fin_incidente = ? "
//            + "CAT_ESTADOS_INCIDENTE_id_estado_incidente = ? "
            + "WHERE id_incidente = ? ";
    public static final String SQL_SELECT =
            "select * from incidente where fecha = ?";
    public static final String SQL_SELECT_ID =
            "select * from incidente where id_incidente = ?";
    public static final String SQL_SELECT_ALL =
            "select * from incidente";
    public static final String SQL_SELETE_TIEMPO_SIN_ATENDER =
            "SELECT now()-fecha as tiempo FROM CAD_DELTA.incidente "
            + "join CAT_ESTADOS_INCIDENTE on id_estado_incidente=CAT_ESTADOS_INCIDENTE_id_estado_incidente "
            + "where id_incidente = ? "
            + "and estado=\"Sin Atender\"";
    public static final String SQL_SELECT_EVENTOS_CERCANOS =
            "SELECT * from COORDENADA_INCIDENTE "
            + "JOIN INCIDENTE ON INCIDENTE_id_incidente=id_incidente "
            + "JOIN CAT_ESTADOS_INCIDENTE on CAT_ESTADOS_INCIDENTE_id_estado_incidente=id_estado_incidente "
            + "where INCIDENTE_id_incidente!= ? "
            + "and CAT_TIPO_INCIDENTE_id_tipo_incidente=? "
            + "and estado!='Terminado' "
            + "and latitude < ?+0.0010 "
            + "and latitude > ?-0.0010 "
            + "and longitud < ?+0.0010 "
            + "and longitud > ?-0.0010 ";
    public static final String SQL_SELECT_ALL_Incidente=
                        "SELECT a.id_incidente,b.nombre_incidente,c.nombre,a.lugar, "
                        +"a.fecha,a.reportante,a.lugar_reportante FROM "
                        +"INCIDENTE a INNER JOIN CAT_TIPO_INCIDENTE b ON "
                        +"b.id_tipo_incidente=a.CAT_TIPO_INCIDENTE_id_tipo_incidente INNER JOIN "
                        +"SECTOR c ON a.SECTOR_id_sector=c.id_sector";
   

    
    public void createIncidente(IncidenteClass a, Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_INSERT);
            ps.setInt(1, a.getCAT_TIPO_INCIDENTE_id_tipo_incidente());
            ps.setInt(2, a.getCAT_ESTADOS_INCIDENTE__id_estado_incidente());
            ps.setInt(3, a.getSECTOR_id_sector() );
            ps.setString(4, a.getLugar());
            ps.setTimestamp(5, a.getFecha());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public void updateIncidente(IncidenteClass a, Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_UPDATE_ESTADO);
//            ps.setInt(1, a.getCAT_FIN_INCIDENTE_id_fin_incidente());
            ps.setInt(1, a.getCAT_ESTADOS_INCIDENTE__id_estado_incidente());
            ps.setInt(2, a.getId_incidente());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public void updateReportante(IncidenteClass a, Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_UPDATE_REPORTANTE);
//            ps.setInt(1, a.getCAT_FIN_INCIDENTE_id_fin_incidente());
            ps.setString(1, a.getReportante());
            ps.setInt(2, a.getId_incidente());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public void updateLugarReportante(IncidenteClass a, Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_UPDATE_LUGAR_REPORTANTE);
//            ps.setInt(1, a.getCAT_FIN_INCIDENTE_id_fin_incidente());
            ps.setString(1, a.getLugar_reportante());
            ps.setInt(2, a.getId_incidente());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }
    public void updateFin(IncidenteClass a, Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        try {
            ps = conn.prepareStatement(SQL_UPDATE_FIN);
            ps.setInt(1, a.getCAT_FIN_INCIDENTE_id_fin_incidente());
//            ps.setInt(1, a.getCAT_ESTADOS_INCIDENTE__id_estado_incidente());
            ps.setInt(2, a.getId_incidente());
            ps.executeUpdate();
        } finally {
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public List loadIncidentes(Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT_ALL);
            rs = ps.executeQuery();
            List resultados = getResultsI(rs);
            if (resultados.size() > 0) {
                return resultados;
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public List obtenerIncidentes(Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT_ALL_Incidente);
            rs = ps.executeQuery();
            List resultados = getResultsI(rs);
            if (resultados.size() > 0) {
                return resultados;
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public List loadIncidentesCercanos(IncidenteClass a,String latitud,String longitud ,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT_EVENTOS_CERCANOS);
            ps.setInt(1, a.getId_incidente());
            ps.setInt(2, a.getCAT_TIPO_INCIDENTE_id_tipo_incidente());
            ps.setString(3, latitud);
            ps.setString(4, latitud);
            ps.setString(5, longitud);
            ps.setString(6, longitud);
            rs = ps.executeQuery();
            List resultados = getResults(rs);
            if (resultados.size() > 0) {
                return resultados;
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public IncidenteClass loadIncidente(IncidenteClass a,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT);
            ps.setTimestamp(1, a.getFecha());
            rs = ps.executeQuery();
            List resultados = getResults(rs);
            if (resultados.size() > 0) {
                return (IncidenteClass)resultados.get(0);
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public IncidenteClass loadIncidenteId(IncidenteClass a,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELECT_ID);
            ps.setInt(1, a.getId_incidente());
            rs = ps.executeQuery();
            List resultados = getResults(rs);
            if (resultados.size() > 0) {
                return (IncidenteClass)resultados.get(0);
            } else {
                return null;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    
    public int loadTiempoSinAtender(IncidenteClass a,Connection conn)
            throws SQLException {
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = conn.prepareStatement(SQL_SELETE_TIEMPO_SIN_ATENDER);
            ps.setInt(1, a.getId_incidente());
            rs = ps.executeQuery();
            List resultados = getResults1(rs);
            if (resultados.size() > 0) {
                return (Integer)resultados.get(0);
            } else {
                return 0;
            }
        } finally {
            cerrar(rs);
            cerrar(ps);
            cerrar(conn);
        }
    }
    private List getResults1(ResultSet rs)
            throws SQLException {
        List results = new ArrayList();
        while (rs.next()) {
            Integer a;
            a=rs.getInt("tiempo");
            results.add(a);
        }
        return results;
    }
    
    private List getResultsI(ResultSet rs)
            throws SQLException {
        List results = new ArrayList();
        while (rs.next()) 
        {
            Incidente_Class a = new Incidente_Class();
            a.setId(rs.getString("id_incidente"));
            a.setTipo_incidente(rs.getString("nombre_incidente"));
            a.setSector(rs.getString("nombre"));
            a.setLugar(rs.getString("lugar"));
            a.setFecha(rs.getString("fecha"));
            a.setReportante(rs.getString("reportante"));
            a.setLugar_reportante(rs.getString("lugar_reportante"));
            results.add(a);
        }
        return results;
    }
    
    private List getResults(ResultSet rs)
            throws SQLException {
        List results = new ArrayList();
        while (rs.next()) {
            IncidenteClass a = new IncidenteClass();
            a.setId_incidente(rs.getInt("id_incidente"));
            a.setCAT_TIPO_INCIDENTE_id_tipo_incidente(rs.getInt("CAT_TIPO_INCIDENTE_id_tipo_incidente"));
            a.setCAT_FIN_INCIDENTE_id_fin_incidente(rs.getInt("CAT_FIN_INCIDENTE_id_fin_incidente"));
            a.setCAT_ESTADOS_INCIDENTE__id_estado_incidente(rs.getInt("CAT_ESTADOS_INCIDENTE_id_estado_incidente"));
            a.setSECTOR_id_sector(rs.getInt("SECTOR_id_sector"));
            a.setLugar(rs.getString("lugar"));
            a.setFecha(rs.getTimestamp("fecha"));
            results.add(a);
        }
        return results;
    }
    
    private void cerrar(Connection cnn) {
        if (cnn != null) {
            try {
                cnn.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }

    private void cerrar(PreparedStatement ps) {
        if (ps != null) {
            try {
                ps.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }

    private void cerrar(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                //manejo del error
            }
        }
    }
}
